package moving

import (
	"src/protoMsg"
	"src/zeus/entity"
	"src/zeus/linmath"
)

/*
操作目标
*/
type IUser interface {
	//获取速度(拿到的速度是厘米单位的，坐标是米单位的)
	GetMovSpeed() float32
	//坐标
	GetMovPos() linmath.Vector3
	//不标脏
	SetMovPosNoDirty(v linmath.Vector3)
	SetMovPos(pos linmath.Vector3)
	//坐标标脏
	SetMovPosDirty()

	//朝向
	GetMovRota() int32
	//不标脏
	SetMovRotaNoDirty(v int32)
	SetMovRota(rota int32)
	//朝向标脏
	SetMovRotDirty()

	//获取路点
	GetMovCurrIndex() int32
	//设置路点不标脏
	SetMovCurrIndexNoDirty(v int32)
	// 设置路点
	SetMovCurrIndex(v int32)

	//给目标设置路点
	BroadcastTargetPosByAOI(tarPos []linmath.Vector3)

	CanMove() bool
	CanRota() bool

	//寻路开始通知
	NoticeStart()
	//寻路结束通知
	NoticeStop()
	//位置强同步通知
	ForcePosNotice(pos linmath.Vector3)
}

type UserMove struct {
	//获取速度
	CurrSpeed *entity.PropInfo
	//用来被设置的对象属性，表示当前坐标
	CurrPos *entity.PropInfo
	//用来被设置的对象属性，表示当前朝向
	CurrRota *entity.PropInfo
	//用来被设置的对象属性，表示当前路点
	Currindex *entity.PropInfo
	//用来被设置的对象属性，表示当前路点
	Paths *entity.PropInfo
}

// 获取速度(拿到的速度是厘米单位的，坐标是米单位的)
func (this *UserMove) GetMovSpeed() float32 {
	return float32(this.CurrSpeed.GetValue().(int64)) / 100.0
}

// 坐标
func (this *UserMove) GetMovPos() linmath.Vector3 {
	return *this.CurrPos.GetValue().(*linmath.Vector3)
}

// 不标脏
func (this *UserMove) SetMovPosNoDirty(v linmath.Vector3) {
	this.CurrPos.LoadValue(&v)
}
func (this *UserMove) SetMovPos(pos linmath.Vector3) {
	this.CurrPos.SetValue(&pos)
}

// 坐标标脏
func (this *UserMove) SetMovPosDirty() {
	this.CurrPos.SetDirty()
}

// 朝向
func (this *UserMove) GetMovRota() int32 {
	return this.CurrRota.GetValue().(int32)
}

// 不标脏
func (this *UserMove) SetMovRotaNoDirty(v int32) {
	this.CurrRota.LoadValue(v)
}
func (this *UserMove) SetMovRota(rota int32) {
	//> 防止重复角度发给客户端，客户端不希望
	if this.GetMovRota() != rota {
		this.CurrRota.SetValue(rota)
	}
}

// 朝向标脏
func (this *UserMove) SetMovRotDirty() {
	this.CurrRota.SetDirty()
}

// 获取路点
func (this *UserMove) GetMovCurrIndex() int32 {
	return this.Currindex.GetValue().(int32)
}

// 设置路点不标脏
func (this *UserMove) SetMovCurrIndexNoDirty(v int32) {
	this.Currindex.LoadValue(v)
}

// 设置路点
func (this *UserMove) SetMovCurrIndex(v int32) {
	this.Currindex.SetValue(v)
}

// 给目标设置路点
func (this *UserMove) BroadcastTargetPosByAOI(tarPos []linmath.Vector3) {
	arrayPos := &protoMsg.ArrayVector3{
		ArrayVector3: []*protoMsg.Vector3{},
	}
	if tarPos != nil {
		for i := range tarPos {
			arrayPos.ArrayVector3 = append(arrayPos.ArrayVector3, &tarPos[i].Vector3)
			// logger.Debug(logger.LogKey_MoveSys, "[BattleEntity] BroadcastTargetPosByAOI pos ", tarPos[i], " eid ", be.GetOwnerEntityId())
		}
	} else {

	}

	// 通过属性同步，可能会有延时，但是刷点逻辑已经开始刷了，造成客户端可能回头。
	this.Paths.SetValue(arrayPos)
}
